﻿/**
 * @file		DDIM_user_custom.c
 * @brief		User custom wrapper
 * @note		None
 * @attention	None
 * 
 * <B><I>ALL RIGHTS RESERVED, COPYRIGHT&copy; SOCIONEXT INCORPORATED 2016</I></B>
 */

#include "FreeRTOS.h"
#include "task.h"
#include "ddim_user_custom.h"
#include "dd_arm.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*==============================================================================*/
/* Definition																	*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Macro declaration															*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Enumeration																	*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Structure																	*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Global Data																	*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Local Method Definition														*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Local Function																*/
/*==============================================================================*/
/* Nothing Special */

/*==============================================================================*/
/* Global Function																*/
/*==============================================================================*/
#ifndef CO_DEBUG_ON_PC
/**
 * Wrapper for printf in DDIM
 */
VOID DDIM_User_Printf(const CHAR* format, ...)
{
	va_list ap;
	
//	Dd_ARM_Critical_Section_Start();
	va_start(ap, format);	/* pgr0039 */
	vprintf(format, ap);
	va_end(ap);
//	Dd_ARM_Critical_Section_End();
}
#endif // CO_DEBUG_ON_PC

/**
 * Wrapper for Task delay in DDIM
 */
VOID DDIM_User_Dly_Tsk(UINT32 dlytim)
{
	// 1 = 130nsec.  7693 = 7693 * 130nsec = 1000090nsec = 1ms.
	volatile int val = dlytim * 7693;
	
	while ( val > 0 ) {
		val--;
	}
}

/**
 * Wrapper for Get Tick Time in DDIM
 */
DDIM_USER_ER DDIM_User_Get_Tim(DDIM_USER_SYSTIM* p_systim)
{
	*p_systim = xTaskGetTickCount();
	
	return D_DDIM_USER_E_OK;
}

/**
 * Trap for assertion in DDIM
 */
VOID DDIM_User_Assertion_Error(VOID)
{
	TickType_t xTicksToDelay = 1000;
	vTaskDelay( xTicksToDelay );		// wait for Ddim_Assertion() debug console log output
	
	for(;;) {
		; // wait forever
	}
}

VOID Dd_ARM_EI(unsigned sr)
{
	taskENABLE_INTERRUPTS();
}

unsigned Dd_ARM_DI(VOID)
{
	taskDISABLE_INTERRUPTS();
	return 0;
}

